package com.example.daibanshiwu.Service.Impl;

import com.example.daibanshiwu.Service.MessageService;
import com.example.daibanshiwu.mapper.MessageMapper;
import com.example.daibanshiwu.pojo.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.*;
import java.util.stream.Collectors;

@Service
public class MessageServiceImpl implements MessageService {

    @Autowired
    private MessageMapper messageMapper;

    @Override
    public List<Message> getMessageAll(int sendUserId) {
        List<Message> rawMessages = messageMapper.selectMessagesAll(sendUserId);

        // 如果数据库没有数据，直接返回空列表
        if (rawMessages == null || rawMessages.isEmpty()) {
            return Collections.emptyList();
        }

        // 2. 使用 Map 进行聚合处理
        // Key: 业务ID (String类型的id)
        // Value: 聚合后的 Message 对象
        // 使用 LinkedHashMap 可以保持查询结果的原始顺序
//        Map<String, Message> messageMap = new LinkedHashMap<>();
//
//        for (Message rawMessage : rawMessages) {
//            String businessId = rawMessage.getId();
//
//            // 从Map中查找是否已经存在该业务ID的消息
//            Message groupedMessage = messageMap.get(businessId);
//
//            if (groupedMessage == null) {
//                // 如果是第一次遇到这个业务ID
//                // 初始化 groupIds 列表
//                rawMessage.setGroupIds(new ArrayList<>());
//                // 将当前记录的 groupId 添加到新列表中 (如果存在)
////                if (rawMessage.getGroupId() && rawMessage.getGroupId() > 0) {
//                rawMessage.getGroupIds().add(rawMessage.getGroupId());
////                }
//                // 将这个新的 Message 对象放入 Map
//                messageMap.put(businessId, rawMessage);
//            } else {
//                // 如果不是第一次遇到，说明之前已经有这个业务ID的消息了
//                // 只需将当前记录的 groupId 添加到已存在的 Message 对象的 groupIds 列表中
////                if (rawMessage.getGroupId() != null && rawMessage.getGroupId() > 0) {
//                    groupedMessage.getGroupIds().add(rawMessage.getGroupId());
////                }
//            }
//        }
//
//        // 3. 将 Map 的 values 转换成 List 并返回
//        return new ArrayList<>(messageMap.values());
        // 2. 使用 Stream API 按业务ID('id')进行分组
        Map<String, List<Message>> messagesGroupedById = rawMessages.stream()
                .collect(Collectors.groupingBy(Message::getId, LinkedHashMap::new, Collectors.toList()));

        // 3. 遍历分组后的Map，对每一组进行聚合
        return messagesGroupedById.values().stream()
                .map(group -> {
                    // 每组中的第一条记录包含了所有主要信息 (title, status等)
                    Message finalMessage = group.get(0);

                    // 从该组所有记录中提取 group_id，并去重
                    List<Integer> uniqueGroupIds = group.stream()
                            .map(Message::getGroupId) // 提取出每个Message对象的groupId
                            .filter(Objects::nonNull)   // 过滤掉null值
                            .distinct()               // 去重！
                            .collect(Collectors.toList()); // 收集成新的List

                    // 设置聚合后的groupIds列表
                    finalMessage.setGroupIds(uniqueGroupIds);

                    return finalMessage;
                })
                .collect(Collectors.toList()); // 将所有处理好的Message对象收集成最终的列表
    }

    @Override
    public String addMessage(Message message) {
        int m=0,c=0,f=0;
        String id = String.valueOf(System.currentTimeMillis());
        message.setId(id);
        for (int i = 0; i < message.getGroupIds().size(); i++) {
            System.out.println(message.getGroupIds().get(i));
            int groupId = message.getGroupIds().get(i);
            List<Integer> list =  messageMapper.selectGroupsMembers(message.getGroupIds().get(0));
            for (int j = 0; j < list.size(); j++) {
                message.setGroupId(groupId);
                message.setReceiverUserId(list.get(j));
                System.out.println(message);
                // 待修改
                m = messageMapper.insertMessageMain(message);
            }
        }
//        System.out.println(message.getMessageChild());
//        return null;
        // 2. 如果有消息详情，设置其 messageId 并插入
        MessageChild child = message.getMessageChild();

        if (child != null) {
            child.setMessageId(id); // 设置外键
            System.out.println("============>");
            System.out.println(child);
            c = messageMapper.insertMessageDetail(child);
        }
        // 3. 如果有文件，设置其 messageId 并插入
        File file = message.getFile();
        if (file != null) {
            file.setMessageId(id); // 设置外键
            f = messageMapper.insertFile(file);
        }
        return (m==1&&c==1&&f==1)?id:null;
    }

    @Override
    public List<Map<String,Object>> getGroups(int userId) {
        return messageMapper.selectGroupsByLeaderId(userId);
    }

    @Override
    public int addFile(MultipartFile file, String id)  {
        try {
            File f = new File();
            f.setMessageId(id);
            f.setFileName(file.getOriginalFilename());
            f.setFileData(file.getBytes());
            return messageMapper.updateFile(f);
        }catch (Exception e){}
        return 0;
    }

    @Override
    public int addExcel(MultipartFile file, String id) {
        try {
            File f = new File();
            f.setMessageId(id);
            f.setExcelName(file.getOriginalFilename());
            f.setExcelData(file.getBytes());
            System.out.println("111111111");
            System.out.println(f);
            return messageMapper.updateExcel(f);
        }catch (Exception e){}
        return 0;
    }

    @Override
    public File getFile(String id) {
        return messageMapper.selectFileById(id);
    }

    @Override
    public File getExcel(String id) {
        return messageMapper.selectExcelById(id);
    }

    @Override
    public Map<String, Object> getStatus(String id) {
        Map<String, Object> status = messageMapper.selectStatus(id);
        System.out.println(status);
        return status;
    }

    @Override
    public List<ProcessingRecord> getRecords(String id) {
        return messageMapper.findProcessingRecordById(id);
    }

    @Override
    public List<GroupMember> getGroupMembers(List<Integer> groupId) {
        return messageMapper.findMembersByGroupIds(groupId);
    }

    @Override
    public ProcessingRecord handleRecordFile(Integer id) {
        return messageMapper.getRecordFile(id);
    }
}
